﻿/*
 This file was create by Xusion at 01.06.2011
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Xml;
using System.Web;
using System.Text.RegularExpressions;

namespace WeiBo.SinaAPI
{
    /// <summary>
    /// 新浪APIWeb服务
    /// </summary>
    public partial class SinaApiWebService : oAuthSina
    {
        #region API服务 获取下行数据集(timeline)接口
        /// <summary>
        /// 返回用户最新发表的微博消息列表。
        /// </summary>
        /// <param name="oauth">oAuthSina</param>
        /// <param name="format">xml json</param>
        /// <param name="paras">
        /// <para>:id	false	int64/string	根据用户ID(int64)或者微博昵称(string)返回指定用户的最新微博消息列表。该参数为REST风格参数，参见注意事项</para>
        /// <para>user_id	false	int64	用户ID，主要是用来区分用户ID跟微博昵称。当微博昵称为数字导致和用户ID产生歧义，特别是当微博昵称和用户ID一样的时候，建议使用该参数</para>
        /// <para>screen_name	false	string	微博昵称，主要是用来区分用户UID跟微博昵称，当二者一样而产生歧义的时候，建议使用该参数</para>
        /// <para>since_id	false	int64	若指定此参数，则只返回ID比since_id大（即比since_id发表时间晚的）的微博消息。</para>
        /// <para>max_id	false	int64	若指定此参数，则返回ID小于或等于max_id的微博消息</para>
        /// <para>count	false	int，默认值20，最大值200。	指定每页返回的记录条数。</para>
        /// <para>page	false	int，默认值1。	页码。注意：最多返回200条分页内容。</para>
        /// <para>base_app	false	int	是否基于当前应用来获取数据。1为限制本应用微博，0为不做限制。</para>
        /// <para>feature	false	int	微博类型，0全部，1原创，2图片，3视频，4音乐. 返回指定类型的微博信息内容。</para>
        /// <para>如果:id、user_id、screen_name三个参数均未指定，则返回当前登录用户最近发表的微博消息列表。</para>
        /// </param>
        /// <returns></returns>
        public string statuses_user_timeline(oAuthSina oauth, string format, string paras)
        {
            string url = "http://api.t.sina.com.cn/statuses/user_timeline." + format + "?" + paras;

            return oauth.oAuthWebRequest(oAuthSina.Method.GET, url, String.Empty);
        }
        #endregion

        #region API服务 用户接口
        /// <summary>
        /// 按用户ID或昵称返回用户资料以及用户的最新发布的一条微博消息。
        /// </summary>
        /// <param name="oauth">oAuthSina</param>
        /// <param name="format">xml json</param>
        /// <param name="paras">
        /// <para>:id	false	int64/string	用户ID(int64)或者昵称(string)。该参数为一个REST风格参数。调用示例见注意事项</para>
        /// <para>user_id	false	int64	用户ID，主要是用来区分用户ID跟微博昵称。当微博昵称为数字导致和用户ID产生歧义，特别是当微博昵称和用户ID一样的时候，建议使用该参数</para>
        /// <para>screen_name	false	string	微博昵称，主要是用来区分用户UID跟微博昵称，当二者一样而产生歧义的时候，建议使用该参数</para>
        /// <para>:id、user_id、screen_name这三个参数三者至少要提供一个</para>
        /// </param>
        /// <returns></returns>
        public string users_show(oAuthSina oauth, string format, string paras)
        {
            if (string.IsNullOrEmpty(paras) || !new Regex("id|user_id|screen_name").IsMatch(paras)) { throw new ArgumentException(":id、user_id、screen_name这三个参数三者至少要提供一个", "paras"); }
            string url = "http://api.t.sina.com.cn/users/show." + format + "?" + paras;

            return oauth.oAuthWebRequest(oAuthSina.Method.GET, url, String.Empty);
        }

        /// <summary>
        /// 获取用户关注列表及每个关注用户的最新一条微博，返回结果按关注时间倒序排列，最新关注的用户排在最前面。
        /// </summary>
        /// <param name="oauth">oAuthSina</param>
        /// <param name="format">xml json</param>
        /// <param name="paras">
        /// <para>:id	false	int64/string	用户ID(int64)或者昵称(string)。该参数为一个REST风格参数。调用示例见注意事项</para>
        /// <para>user_id	false	int64	用户ID，主要是用来区分用户ID跟微博昵称。当微博昵称为数字导致和用户ID产生歧义，特别是当微博昵称和用户ID一样的时候，建议使用该参数</para>
        /// <para>screen_name	false	string	微博昵称，主要是用来区分用户UID跟微博昵称，当二者一样而产生歧义的时候，建议使用该参数</para>
        /// <para>cursor	false	int	用于分页请求，请求第1页cursor传-1，在返回的结果中会得到next_cursor字段，表示下一页的cursor。next_cursor为0表示已经到记录末尾。</para>
        /// <para>count	false	int，默认20，最大200	每页返回的最大记录数，最大不能超过200，默认为20。</para>
        /// <para>:id, user_id, screen_name 可以任选一个参数，在3个都不提供的情况下，系统返回当前登录用户的关注列表</para>
        /// </param>
        /// <returns></returns>
        public string statuses_friends(oAuthSina oauth, string format, string paras)
        {
            string url = "http://api.t.sina.com.cn/statuses/friends." + format + "?" + paras;

            return oauth.oAuthWebRequest(oAuthSina.Method.GET, url, String.Empty);

        }

        /// <summary>
        /// 获取用户粉丝列表及每个粉丝的最新一条微博，返回结果按粉丝的关注时间倒序排列，最新关注的粉丝排在最前面。每次返回20个,通过cursor参数来取得多于20的粉丝。注意目前接口最多只返回5000个粉丝。
        /// </summary>
        /// <param name="oauth">oAuthSina</param>
        /// <param name="format">xml json</param>
        /// <param name="paras">
        /// <para>:id	false	int64/string	用户ID(int64)或者昵称(string)。该参数为一个REST风格参数。调用示例见注意事项</para>
        /// <para>user_id	false	int64	用户ID，主要是用来区分用户ID跟微博昵称。当微博昵称为数字导致和用户ID产生歧义，特别是当微博昵称和用户ID一样的时候，建议使用该参数</para>
        /// <para>screen_name	false	string	微博昵称，主要是用来区分用户UID跟微博昵称，当二者一样而产生歧义的时候，建议使用该参数</para>
        /// <para>cursor	false	int	用于分页请求，请求第1页cursor传-1，在返回的结果中会得到next_cursor字段，表示下一页的cursor。next_cursor为0表示已经到记录末尾。</para>
        /// <para>count	false	int，默认20，最大200	每页返回的最大记录数，最大不能超过200，默认为20。</para>
        /// <para>:id, user_id, screen_name 可以任选一个参数，在3个都不提供的情况下，系统返回当前登录用户的关注列表</para>
        /// </param>
        /// <returns></returns>
        public string statuses_followers(oAuthSina oauth, string format, string paras)
        {
            string url = "http://api.t.sina.com.cn/statuses/followers." + format + "?" + paras;

            return oauth.oAuthWebRequest(oAuthSina.Method.GET, url, String.Empty);

        }
        #endregion


        #region API服务 账号接口
        /// <summary>
        /// 清除已验证用户的session，退出登录，并将cookie设为null。主要用于widget等web应用场合。
        /// </summary>
        /// <param name="oauth">oAuthSina</param>
        /// <param name="format">xml json</param>
        /// <returns></returns>
        public string account_end_session(oAuthSina oauth, string format)
        {
            string url = "http://api.t.sina.com.cn/account/end_session." + format;

            return oauth.oAuthWebRequest(oAuthSina.Method.GET, url, String.Empty);
        }
        #endregion


        #region API服务 微博访问接口
        /// <summary>
        /// 发布一条微博信息。也可以同时转发某条微博。请求必须用POST方式提交
        /// </summary>
        /// <param name="oauth">oAuthSina</param>
        /// <param name="format">xml json</param>
        /// <param name="paras">
        /// <para>status	true	string	要发布的微博消息文本内容</para>
        /// <para>in_reply_to_status_id	false	int64	要转发的微博消息ID。</para>
        /// <para>lat	false	float	纬度。有效范围：-90.0到+90.0，+表示北纬。</para>
        /// <para>long	false	float	经度。有效范围：-180.0到+180.0，+表示东经。</para>
        /// <para>注意：lat和long参数需配合使用，用于标记发表微博消息时所在的地理位置，只有用户设置中geo_enabled=true时候地理位置信息才有效。</para>
        /// <para>annotations	false	string	元数据，主要是为了方便第三方应用记录一些适合于自己使用的信息。每条微博可以包含一个或者多个元数据。请以json字串的形式提交，字串长度不超过512个字符，具体内容可以自定。</para>
        /// </param>
        /// <returns></returns>
        public string statuses_update(oAuthSina oauth, string format, string paras)
        {
            if (string.IsNullOrEmpty(paras) || !new Regex("status").IsMatch(paras)) { throw new ArgumentException("status	true	string	要发布的微博消息文本内容", "paras"); }
            string url = "http://api.t.sina.com.cn/statuses/update." + format + "?";
            return oauth.oAuthWebRequest(oAuthSina.Method.POST, url, paras);
        }

        /// <summary>
        /// 发表图片微博消息。请求必须用POST方式提交(注意采用multipart/form-data编码方式)。目前上传图片大小限制为小于5M。
        /// </summary>
        /// <param name="oauth">oAuthSina</param>
        /// <param name="format">xml json</param>
        /// <param name="paras">
        /// <para>status	true	string	要发布的微博消息文本内容</para>
        /// <para>in_reply_to_status_id	false	int64	要转发的微博消息ID。</para>
        /// <para>lat	false	float	纬度。有效范围：-90.0到+90.0，+表示北纬。</para>
        /// <para>long	false	float	经度。有效范围：-180.0到+180.0，+表示东经。</para>
        /// <para>注意：lat和long参数需配合使用，用于标记发表微博消息时所在的地理位置，只有用户设置中geo_enabled=true时候地理位置信息才有效。</para>
        /// </param>
        /// <param name="filepath">
        /// <para>图片路径</para>
        /// <para>要上传的图片。仅支持JPEG,GIF,PNG图片,为空返回400错误。目前上传图片大小限制为小于5M。</para>
        /// </param>
        /// <param name="picName">图片名字</param>
        /// <returns></returns>
        public string statuses_upload(oAuthSina oauth, string format, string paras, string filepath, string picName)
        {
            if (string.IsNullOrEmpty(paras) || !new Regex("status").IsMatch(paras)) { throw new ArgumentException("status	true	string	要发布的微博消息文本内容", "paras"); }
            string url = "http://api.t.sina.com.cn/statuses/upload." + format + "?";
            return oauth.oAuthWebRequestWithPic(oAuthSina.Method.POST, url, paras, filepath, picName);
        }
        #endregion

    }
}
